local clist = require("list")
local class = require("class")
local super = require("heap")

---@class tqueue:vesselheap @一个定时器队列
local this = class(super)

function this:ctor()
    super.ctor(self)
    ---桶列表
    self._buckets = {}
    ---唯一键
    self._uniqmap = {}
end

function this:launch()
    super.launch(self)
end

function this:clear()
    super.clear(self)
end

---查找链表
function this:find_list(node)
    local tid = node.data.elapse
    local list = self._buckets[tid] or clist.new()
    self._buckets[tid] = list
    return list
end

---添加定时器
function this:push_back(node, bflg)
    ---获取定时器列表
    local list = self:find_list(node)

    if bflg then
        self._uniqmap[node.auto] = node
        self:insert(node)
    else
        ---记录定时器
        local link = list:push_back(node)
        self._uniqmap[node.auto] = link
        if 1 == list:size() then
            ---更新最小堆
            self:insert(node)
        end
    end
    return node.auto, node
end

---删除定时器
function this:find_move(node)
    ---获取定时数据
    local link = self._uniqmap[node.auto]
    self._uniqmap[node.auto] = nil
    if link == node then
        self:deleteBy(node.auto)
    else
        ---定点首次
        ---获取定时器列表
        local list = self:find_list(node)
        ---删除链表的节点
        list:erase(link)
        ---删除小堆节点
        if not self:deleteBy(node.auto) then
            ---没有数据说明不是头节点
            return
        end
        ---更新小堆节点
        if list:size() <= 0 then
            ---没有数据说明不需要添加
            return
        end
        link = list:reder()
        self:insert(link.data)
        return node
    end
end

---标识删除中
function this:auto_move(auto)
    local link = self._uniqmap[auto]
    if not link then
        return
    end
    if link.auto then
        return self:find_move(link)
    else
        return self:find_move(link.data)
    end
end

function this:find_node(auto)
    local link = self._uniqmap[auto]
    if link.auto then
        return link
    else
        return link.data
    end
end

return this
